#include "tools.h"
#include <stdlib.h>
#include <sys/types.h>          /* See NOTES */
#include <sys/socket.h>
#include <string.h>
#include "pub_defs.h"

// 端口号字符最大长度定义
#define MAX_PORT_BUF_LEN	10

/*========================================================== 
 	函数名 ：		ConvertStrToInt
	功能 ：		转换字符串为整形
 	算法实现 ：<可选项> 
 	参数说明 ： const char* pchBuf [in] 要转换的字符串
 	返回值说明：转换结果
------------------------------------------------------------------------------------------------------- 
修改记录 ： 日 期 版本 修改人 走读人 修改记录
1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
int ConvertStrToInt(const char *pchBuf)
{
	return atoi(pchBuf);
}

/*========================================================== 
 	函数名 ：		ParseRtspUrl
	功能 ：		解析url中ip和端口号（调用时候，确保传出数据缓冲区足够大，不保证内存是否越界）
 	算法实现 ：<可选项> 
 	参数说明 ： char* pchUrl [in] url地址
				char* pchHost [out] 输出解析的主机地址
				int* nPort [out] 输出解析的端口
				char* pchUser [out] 输出解析用户名
				char* pchPass [out] 输出解析密码
 	返回值说明：0 解析成功 -1 失败
------------------------------------------------------------------------------------------------------- 
修改记录 ： 日 期 版本 修改人 走读人 修改记录
1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
int ParseRtspUrl(const char *pchUrl,char *pchHost,int *nPort,char *pchUser,char *pchPass)
{
	if(NULL == pchUrl || 
		NULL == pchHost ||
		NULL == nPort || 
		NULL == pchUser ||
		NULL == pchPass)
	{
		TRACE_DEBUG("invalid parameter!");
		return -1;
	}

	// 首先找到rtsp协议字段
	char *pchRtspPrefix = "rtsp://";
	int nRtspPrefixLen = strlen(pchRtspPrefix);
	int nCmpRet = strncmp(pchUrl,pchRtspPrefix,nRtspPrefixLen);
	if(0 != nCmpRet)
	{
		TRACE_DEBUG("invalid rtsp url");
		return -1;
	}

	// 查找是否存在用户名密码
	char *pchRtspNoPrefix = pchUrl + nRtspPrefixLen;
	char *pchSplitA = strchr(pchRtspNoPrefix,'@');
	int nParseUserPassOk = 0;
	if(NULL != pchSplitA) // 找到用户名密码
	{
		strncpy(pchUser,pchRtspNoPrefix,pchSplitA - pchRtspNoPrefix);
		pchUser[pchSplitA - pchRtspNoPrefix] = '\0';
		char *pchSplitB = strchr(pchRtspNoPrefix,':');
		if(NULL != pchSplitB)
		{
			nParseUserPassOk = 1;
			int nPassLen = pchSplitB - pchSplitA - 1;
			strncpy(pchPass,pchSplitA + 1,nPassLen);
			pchPass[nPassLen] = '\0';
		}
	}
	/// 查找ip地址
	char *pchRtspUrlNoUser = pchUrl + nRtspPrefixLen + strlen(pchUser) + strlen(pchPass) + 2;
	// 不存在用户名密码
	if(0 == nParseUserPassOk)
	{
		pchUser[0] = '\0';
		pchPass[0] = '\0';
		pchRtspUrlNoUser = pchUrl + nRtspPrefixLen;
	}

	// 解析ip端口
	// ip端口分隔位置
	char *pchSplitIpPort = strchr(pchRtspUrlNoUser,':');
	if(NULL == pchSplitIpPort)
	{
		TRACE_DEBUG("parse ip prot failed");
		return -1;
	}
	strncpy(pchHost,pchRtspUrlNoUser,pchSplitIpPort-pchRtspUrlNoUser);
	// 端口后面目录位置
	char *pchDir = strchr(pchRtspUrlNoUser,'/');
	char pchPortBuf[MAX_PORT_BUF_LEN] = {0};
	if(NULL != pchDir)
	{
		int nPortLen = pchDir - pchSplitIpPort - 1;
		if(nPortLen <= 0 || nPortLen > MAX_PORT_BUF_LEN)
		{
			TRACE_DEBUG("parse port failed");
			return -1;
		}
		strncpy(pchPortBuf,pchSplitIpPort + 1,nPortLen);
	}
	return 0;
}

/*========================================================== 
 	函数名 ：		CreateSocket
	功能 ：		创建socket描述符
 	算法实现 ：<可选项> 
 	参数说明 ：  int nDomain [in] 设置通信域
				int nType 	[in] 套接字通信类型
				int nProtocol [in] 某个协议的特定类型
 	返回值说明：转换结果
------------------------------------------------------------------------------------------------------- 
修改记录 ： 日 期 版本 修改人 走读人 修改记录
1998/09/15 V1.0 某某（中文） 某某（中文） 记录关键内容
===========================================================*/
int CreateSocket(int nDomain, int nType, int nProtocol)
{
	int nSocket = socket(nDomain,nType,nProtocol);
	return nSocket;
}
